3282
4515
Тут вже є відповіді на це питання:
Немає неявного перетворення в перевантаженому операторі
(2 відповіді)
Закрито 7 років тому.
Я пишу просту обгортку для елементарного типу, і намагаюся уникати надто багато варіантів стандартних операторів. Я сподівався, що неявне перетворення типу допоможе, але це не так. Ось приклад, що розібрався:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Оператор Int + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(порожнеча) (Int (1) + 2); // Чудово
(порожнеча) (2 + Int (1)); // помилка: недійсні операнди до двійкового виразу ('int' та 'Int')
}
Я використовую llvm. Перший рядок основного компілюється чудово. Другий викликає помилку. Тепер, що я сподівався, що відбудеться у другому рядку, це те, що 2 буде неявно перетворено в Int (2), після чого буде виклик оператора +. Чому цього не відбувається? Чому неявне перетворення відбувається в першому рядку? 
Це трапляється у першому рядку, оскільки єдиним доступним оператором + є оператор + (Int &) (який має неявний перший параметр Int для цього екземпляра). Другий рядок не вдається, оскільки перший параметр - це int, і він не знає, що йому потрібно перетворити його перед спробою операції (він не знає, що йому потрібно використовувати Int :: operator +).
Ви можете уникнути цієї проблеми, зробивши оператора функцією друзів, що не є членом (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
друг Int оператор + (const Int & lhs, const Int & rhs);
};
Оператор Int + (const Int & lhs, const Int & rhs)
{
повернути lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
повернути 0;
}
|
Не відповідь, яку ви шукаєте? Перегляньте інші запитання, позначені тегом c ++ operator-keyword implicit-conversion, або задайте власне запитання.